home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s_tool / file.c < prev    next >
Text File  |  1999-06-10  |  14KB  |  615 lines

  1. #include    "JX250.H"
  2. #include    <sys\iocs.h>
  3. #include    <sys\dos.h>
  4. #include    <sys\scsi.h>
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <io.h>
  9. #include    <_tnb.c>
  10.  
  11. struct    HEN {
  12.     UNchar    *st;
  13.     int    *po;
  14. } hen[]={
  15.     {"SCSI-ID",        &SCSI_ID},
  16.     //--- プレ座標
  17.     {"Pre-X1",        &PreX1},
  18.     {"Pre-X2",        &PreX2},
  19.     {"Pre-Y1",        &PreY1},
  20.     {"Pre-Y2",        &PreY2},
  21.     {"Pre-Mag",        &PreBai},    // 0;標準 1;x2 2;x3 3;x4
  22.     {"Pre-ViewX",        &PrePX},    // 拡大表示の時のイメージ表示座標
  23.     {"Pre-ViewY",        &PrePY},
  24.     {"Pre-Speed",        &PreViewS},    // 0;画質。1;速度
  25.     //--- スキャンサイズ
  26.     {"Scan-X",        &ScanDotX},
  27.     {"Scan-Y",        &ScanDotY},
  28.     {"ScanDPI-X",        &ScanDpiX},
  29.     {"ScanDPI-Y",        &ScanDpiY},
  30.     {"Scan-Speed",        &ScanSpeed},    // 0;低速。1;速度
  31.     //--- 補正
  32.     {"Bright",        &Bright},    // 濃度
  33.     {"Light-M",        &LightM},    // 明度
  34.     {"Light-R",        &LightR},
  35.     {"Light-G",        &LightG},
  36.     {"Light-B",        &LightB},
  37.     {"Gamma-M",        &GammaM},    // γ
  38.     {"Gamma-R",        &GammaR},
  39.     {"Gamma-G",        &GammaG},
  40.     {"Gamma-B",        &GammaB},
  41.     {"Thre-M",        &ThreM},    // しきい値
  42.     {"Thre-R",        &ThreR},
  43.     {"Thre-G",        &ThreG},
  44.     {"Thre-B",        &ThreB},
  45.     //--- モード
  46.     {"Scan-Mode",        &ScanMode},    // スキャン値の単位 0;DPI 1;DOT
  47.     {"Pre-Unit",        &PreUnit},    // プリスキャン値の単位 0;dot 1;cm 2;inch
  48.     {"Image-Mode",        &ImageMode},    // 0;カラー 1;白黒
  49.     {"Image-Color",        &ImageColMode},    // 0;多値 1;二値
  50.     {"Image-Direc",        &ImageDirec},    // 0;縦 1;横
  51.     {"Poji-Nega",        &PojiNegaMode},    // 0;ポジ 1;ネガ
  52.     {"Drop-Color",        &DropColor},    // 0;なし 1;R 2;G 3;B
  53.     {"FullCol-Mode",    &FullColor},    // 0;64k 1;24bit
  54.     {"HalfDisp-Mode",    &C64halfMode},    // 0;中間処理あり 1;なし
  55.     {"Jpeged-Use",        &JpegedUseMode}, // 0;64k の時使用する 1;使用しない
  56.     {"SaveFrm-Mode",    &SaveFrmMode},    // 0;スキャンサイズに変更
  57. //    {"ReadPacket-Mode",    &ReadPacketMode}, // 0;一括 1;分割
  58.     //--- その他
  59.     {"Asp-Mode",        &AspMode},    //「画像」の 0;(2:3) 1;(1:1)
  60.     {"FilerSort-Mode",    &FilerSortMode}, // 0;dir 1;filename
  61.     {"FilerAll-Mode",    &FilerAllMode},    // 0;関係ファイルのみ表示 1;全ファイル表示
  62.     //--- 記録モード
  63.     {"Rec-X1",        &RecX1},
  64.     {"Rec-Y1",        &RecY1},
  65.     {"Rec-X2",        &RecX2},
  66.     {"Rec-Y2",        &RecY2},
  67.     //--- 画像モード
  68.     {"Img-Mag",        &RecVwBai},    // 0;x1  1;x2  2;x4 3;x8
  69.                         //-1;/2 -2;/4 -3;/8
  70.     {"Save-Mode",        &RecSavMode},    // 0;CUT 1;PIC 2;GLM 3;BMP 4;JPEG 5;RGB
  71.     {"Gray-Thres",        &GrayPoint},    // グレイスケール化の敷居値
  72.     {"Mono-Thres",        &MonoPoint},    // 二値化の敷居値
  73.     {"Defocus-Point",    &DefocusPoint},    // 平滑化の値
  74.     0,0
  75. };
  76. struct    HENs {
  77.     UNchar    *st;
  78.     UNchar    *po;
  79. } hens[]={
  80.     {"Jpeg-Swc",        JpegSwc},
  81.     {"Jpeg24-Swc",        Jpeg24Swc},
  82.     {"Jpeg24-temp",        RGBtemp},
  83.     0,0
  84. };
  85.  
  86. //=== ファイラー
  87. /*struct  DDST {
  88.     UNchar    fname[21];    //ファイル名
  89.     UNchar    fext[6];    //拡張子名(「.」から)
  90.     size_t    size;        //サイズ
  91.     int    date;        //日付
  92.     char    atr;        //属性
  93.     //UNchar    fexm;        //拡張子m 0;ex1 1;ex2の拡張子
  94. };*/
  95. struct    DDST DDS[256];
  96. int    DDS_max;    /*バッファの数 -1なら、未挿入 */
  97.  
  98. //UNchar    Afname[21];    /*対照ファイル名*/
  99. //UNchar    Afext[6];    /*対照ファイル拡張子*/
  100. UNchar    Apath[256];        /*対象パス(カレントパス)*/
  101. UNchar    Afile[30];        /*対象ファイル名*/
  102. int    Drive;            /*1=A: 2=B: ・・・    */
  103.  
  104.  
  105. UNchar    RSM[6][8]={            // 0;CUT 1;PIC 2;GLM 3;BMP 4;JPEG 5;RGB
  106.         "*.CUT","*.PIC","*.GLM",
  107.         "*.BMP","*.JPG","*.RGB"
  108. };
  109.  
  110. UNchar    *mat_vadds;
  111. int    mat_xwidth,mat_ywidth;
  112.  
  113. /*************************************************
  114.     コンフィグファイルを作る
  115. [in] na = ファイル名
  116.     0 ならデフォルト
  117. [out] -1 ; エラーった
  118. *************************************************/
  119. int    CreateCnf(na)
  120. char    *na;
  121. {
  122. int    i;
  123. FILE    *fp;
  124. UNchar    nb[256];
  125. UNchar    buf[256];
  126. UNchar    dmy[256];
  127. if ( na==0 || *na==0 ){
  128.     //-- S_TOOLSのあるパス
  129.     struct    _psp *pd = _dos_getpdb();
  130.     jstrcpy(nb,(char *)pd->exe_path);
  131.     if ( jxscanner_==_JX250_ )
  132.         jstrcat(nb,"S_TOOL25.CNF");    // JX250
  133.     elif ( jxscanner_==_JX270_ )
  134.         jstrcat(nb,"S_TOOL27.CNF");    // JX270
  135.     elif ( jxscanner_==_JX350_ )
  136.         jstrcat(nb,"S_TOOL35.CNF");    // JX350
  137.     elif ( jxscanner_==_JX330_ )
  138.         jstrcat(nb,"S_TOOL33.CNF");    // JX330
  139.     elif ( jxscanner_==_JX325_ )
  140.         jstrcat(nb,"S_TOOL32.CNF");    // JX325
  141.     else    jstrcat(nb,"S_TOOL.CNF");
  142.     na=nb;
  143. }
  144. if ( DrvAccess(1,na)!=0 )
  145.     return(-1);
  146. fp=fopen(na,"wt");
  147. if ( fp==NULL )
  148.     return(-1);
  149. for(i=0;;i++){
  150.     if ( hen[i].st==0 )
  151.         break;
  152.     sprintf(buf,"%-16s = %%d\n",hen[i].st);
  153.     fprintf(fp,buf,*hen[i].po);
  154. }
  155. for(i=0;;i++){
  156.     if ( hens[i].st==0 )
  157.         break;
  158.     sprintf(buf,"%-16s = %%s\n",hens[i].st );
  159.     fprintf(fp,buf,hens[i].po);
  160. }
  161. if ( ferror(fp) ){
  162.     //-- エラってた
  163.     //    delete したほうがいい?
  164.     fclose(fp);
  165.     return(-1);
  166. }
  167. fclose(fp);
  168. return(0);
  169. }
  170. /*************************************************
  171.     コンフィグファイルを読み込む
  172.         &設定する
  173. [in] na = ファイル名
  174.     0 ならデフォルト
  175. [out] -1 ; エラーった
  176. *************************************************/
  177. int    ReadCnf(na)
  178. char    *na;
  179. {
  180. int    i,j,l;
  181. FILE    *fp;
  182. UNchar    *s;
  183. UNchar    nb[256];
  184. UNchar    buf[1024];
  185. UNchar    name[32];
  186. if ( na==0 || *na==0 ){
  187.     //-- S_TOOLSのあるパス
  188.     struct    _psp *pd = _dos_getpdb();
  189.     jstrcpy(nb,(char *)pd->exe_path);
  190.     if ( jxscanner_==_JX250_ )
  191.         jstrcat(nb,"S_TOOL25.CNF");    // JX250
  192.     elif ( jxscanner_==_JX270_ )
  193.         jstrcat(nb,"S_TOOL27.CNF");    // JX270
  194.     elif ( jxscanner_==_JX350_ )
  195.         jstrcat(nb,"S_TOOL35.CNF");    // JX350
  196.     elif ( jxscanner_==_JX330_ )
  197.         jstrcat(nb,"S_TOOL33.CNF");    // JX330
  198.     elif ( jxscanner_==_JX325_ )
  199.         jstrcat(nb,"S_TOOL32.CNF");    // JX330
  200.     else    jstrcat(nb,"S_TOOL.CNF");
  201.     na=nb;
  202. }
  203. if ( DrvAccess(0,na)!=0 )
  204.     return(-1);
  205. fp=fopen(na,"r");
  206. if ( fp==NULL )
  207.     return(-1);
  208. JpegSwc[0]=0;
  209. for(;;){
  210.     j=(int)fgets(buf,1023,fp);
  211.     if ( j==NULL )
  212.         break;
  213.     for(i=0;;i++){
  214.         if ( hens[i].st==0 )
  215.             break;
  216.         if  ( sscanf(buf,"%s =",name)==1 && strcmp(hens[i].po,name)==0 ){
  217.             s=name;
  218.             while( *s++!='=' );
  219.             while( *s==' ' )
  220.                 s++;
  221.             strcpy(hens[i].po,s);
  222.             s=hens[i].po;
  223.             while( *s!=0 ){
  224.                 if ( ZenChk(*s) )
  225.                     s++;
  226.                 if ( *s==0xD || *s==0xA || *s==0x1A )
  227.                     *s=0;
  228.                 s++;
  229.             }
  230.             i=-1;
  231.             break;
  232.         }
  233.     }
  234.     if ( i<0 )
  235.         continue;
  236.     if  ( sscanf(buf,"%s = %d",name,&l)!=2 )
  237.         continue;
  238.     for(i=0;;i++){
  239.         if ( hen[i].st==0 )
  240.             break;
  241.         if ( strcmp(hen[i].st,name)==0 ){
  242.             //一致した
  243.             *hen[i].po=l;
  244.             break;
  245.         }
  246.     }
  247. }
  248. fclose(fp);
  249. //--
  250. //CalcScanDpi();
  251. //--
  252. if ( jxscanner==_JX350_ ){
  253.     //jx350 なら・・・
  254.     if ( LightR==LightG && LightG==LightB ){
  255.         ;
  256.     } else {
  257.         LightR=LightG=LightB;
  258.     }
  259.     if ( LightR>=0x8000+600 ){
  260.         LightR=LightG=LightB=0x8000+600;
  261.     }
  262. }
  263. return(0);
  264. }
  265. /******************************************************
  266.                   ファイルサーチ
  267.  
  268.     struct DDST {
  269.         UNchar    fname[20];    //ファイル名
  270.         UNchar    fext[6];    //拡張子名(「.」から)
  271.         size_t    size;        //サイズ
  272.         int    date;        //日付
  273.     }
  274.  
  275. ******************************************************/
  276. void    FileSearch(mo)
  277. int    mo;
  278. {
  279. int    m,n,z,nn,ol,ay;
  280. char    demmy[150];
  281. char    buf[256];
  282. char    olpth[256];
  283. char    *s;
  284. char    path[16];
  285. ay=-1;
  286. ol=-1;
  287. olpth[0]=0;
  288. if ( FilerAllMode==0 ){
  289.     // 0;関係ファイルのみ表示
  290.     jstrcpy(path,RSM[ RecSavMode ]);
  291. } else {
  292.     // 1;全ファイル表示
  293.     jstrcpy(path,"*.*");
  294. }
  295. ViewFileY=0;
  296. if ( mo==0 ){
  297.     Drive= GetDrvDir(Drive,Apath);
  298.     ChDrvDir(Apath);
  299. }
  300. if ( (_dos_drvctrl(0,Drive)&bit(1))==0 ){
  301.     /*未挿入?*/
  302.     DDS_max=-1;    /*バッファの数 -1なら、未挿入 */
  303.     return;
  304. }
  305. _dos_drvctrl(2,Drive);
  306. /*-- ディレクトリサーチ --*/
  307. strsfn(Apath,demmy,buf,demmy,demmy);
  308. //printf("%s\n",demmy);
  309. if ( (buf[0]=='\\' && buf[1]==0) || buf[0]==0 ){
  310.     //ルートだ
  311.     n=0;
  312. } else {
  313.     n=1;
  314.     DDS[0].fname[0]='.';
  315.     DDS[0].fname[1]='.';
  316.     DDS[0].fname[2]=0;
  317.     DDS[0].fext[0]=0;
  318.     DDS[0].atr=bit(4);
  319. }
  320. for(z=nn=0,m=0;n<256;n++,m++){
  321.     if ( m==0 )
  322.         s= files(buf,&(DDS[n].atr),&(DDS[n].date),&(DDS[n].size),"*.*",bit(4));
  323.     else    s=nfiles(buf,&(DDS[n].atr),&(DDS[n].date),&(DDS[n].size));
  324.     if ( s==NULL )
  325.         break;
  326.     if ( s[0]=='.' && s[1]==0 ){
  327.         n--;
  328.         continue;
  329.     }
  330.     if ( s[0]=='.' && s[1]=='.' && s[2]==0 ){
  331.         n--;
  332.         z=1;
  333.         continue;
  334.         //DDS[n].fname[0]='.';
  335.         //DDS[n].fname[1]='.';
  336.         //DDS[n].fname[2]=0;
  337.         //DDS[n].fext[0]=0;
  338.     } else {
  339.         strsfn(s,demmy,demmy,&(DDS[n].fname),&(DDS[n].fext));
  340.     }
  341.     //DDS[n].fexm=0;
  342. }
  343. DDS_sort(z,n-1,FilerSortMode);    // ディレクトリだけでソート
  344. /*-- ファイルチェック --*/
  345. z=n;
  346. for(nn=n,m=0;n<256;n++,m++){
  347.     if ( m==0 )
  348.         s= files(buf,&(DDS[n].atr),&(DDS[n].date),&(DDS[n].size),path,bit(5));
  349.     else    s=nfiles(buf,&(DDS[n].atr),&(DDS[n].date),&(DDS[n].size));
  350.     if ( s==NULL )
  351.         break;
  352.     strsfn(s,demmy,demmy,&(DDS[n].fname),&(DDS[n].fext));
  353.     //DDS[n].fexm=0;
  354. }
  355. DDS_sort(z,n-1,FilerSortMode);
  356. DDS_max=n;    /*バッファの数 -1なら、未挿入 */
  357. _dos_drvctrl(3,Drive);
  358. }
  359. /****************************************************
  360.   カレントを文字列のドライヴ/ディレクトリにする
  361. [戻り値]ドライヴナンバー( 1=A: 2=B: ・・・)
  362. ****************************************************/
  363. int    ChDrvDir(st)
  364. UNchar    *st;
  365. {
  366. int    i;
  367. i=(st[0]|0x20)-'a';
  368. if ( _dos_chgdrv(i)<i )    /*カレントドライヴチェンジ*/
  369.     return( i+1 );
  370. _dos_chdir(st);
  371. return( i+1 );
  372. }
  373. /****************************************************
  374.   今のカレントを読みだす
  375. [戻り値]ドライヴナンバー( 1=A: 2=B: ・・・)
  376. ****************************************************/
  377. int    GetDrvDir(d,st)
  378. int    d;
  379. UNchar    *st;
  380. {
  381. if ( d<=0 )
  382.     d=_dos_curdrv()+1;
  383. st[0]='A'+d-1;
  384. st[1]=':';
  385. st[2]='\\';
  386. st[3]=0;        // curdir がエラーの可能性あり。
  387. _dos_curdir(d,&st[3]);
  388. if ( st[3]!=0 )
  389.     jstrcat(&st[3],"\\");
  390. return(d);
  391. }
  392. /****************************************************
  393.   ファイル名主部と拡張を合成してコピー
  394. ****************************************************/
  395. void    jstrcpyfnm(ss,fm,ex)
  396. UNchar    *ss,*fm,*ex;
  397. {
  398. jstrcpy(ss,fm);
  399. if ( ex[0]!=0 ){
  400.     jstrcat(ss,".");
  401.     jstrcat(ss,ex);
  402. }
  403. }
  404. /*++*/
  405. void    jstrcatfnm(ss,fm,ex)
  406. UNchar    *ss,*fm,*ex;
  407. {
  408. jstrcat(ss,fm);
  409. if ( ex[0]!=0 ){
  410.     jstrcat(ss,".");
  411.     jstrcat(ss,ex);
  412. }
  413. }
  414.  
  415. /***************************************************
  416.                Fread(f,ad,ll)
  417. [戻り値] 0:正常成功
  418.      エラー文字列
  419. ***************************************************/
  420. char    *Fread(f,ad,ll)
  421. int    f;
  422. void    *ad;
  423. int    ll;
  424. {
  425. int    r;
  426. static    UNchar    fsm[]="ファイルサイズが足りません";
  427. static    UNchar    fwer[]="読み込みエラーです";
  428. r=_dos_read(f,ad,ll);
  429. if ( r<0 )
  430.     return(fwer);    //読み込みエラー
  431. if ( r==ll )
  432.     return((char*)0);
  433. return(fsm);    //読み込みエラー(足りない)
  434. }
  435. /***************************************************
  436.                Fwrite(f,ad,ll)
  437. [戻り値] 0:正常成功
  438.      エラー文字列
  439. ***************************************************/
  440. char    *Fwrite(f,ad,ll)
  441. int    f;
  442. void    *ad;
  443. int    ll;
  444. {
  445. int    r;
  446. static    UNchar    erf[]="ディスクフルです";
  447. static    UNchar    er[]="書き込みエラーです";
  448. r=_dos_write(f,ad,ll);
  449. if ( r<0 )
  450.     return(er);
  451. if ( r==ll )
  452.     return((char*)0);
  453. return(erf);
  454. }
  455. /***************************************************
  456.                新しいファイルをオープン
  457. [戻り値] 0:正常成功
  458.     -1:エラー
  459. ***************************************************/
  460. int    NewFileCreate()
  461. {
  462. int    f;
  463. if ( DrvAccess(1,Afile)!=0 ){
  464.     Dialog(0,"プロテクトされています",0,1);
  465.     return(-1);
  466. }
  467. f=_dos_open(Afile,0);
  468. if ( f>=0 ){
  469.     // ファイルが open できた
  470.     _dos_close(f);
  471.     if ( Dialog("同名ファイルがあります",0,"重ね書きしますか?",2)!=0 )
  472.         return(-1);
  473. }
  474. f=_dos_create(Afile,bit(5));
  475. return(f);
  476. }
  477. /***************************************************
  478.         MAT.$$$ を読み込みチェックする
  479. [戻り値] 0:正常成功
  480. ***************************************************/
  481. int    MatDefRead()
  482. {
  483. int    i;
  484. FILE    *f;
  485. UNchar    *s;
  486. UNchar    buf[256];
  487. UNchar    MAT[256];    //MATIER のあるパス
  488. UNchar    dmi[512];
  489. i=_dos_getenv("MATIER",0,MAT);            // 環境変数MATIERの中身を得る
  490. if ( i<0 ){
  491.     printf(" 環境変数`MATIER'が設定されていません。\n");
  492.     return(-1);
  493. }
  494. for(s=MAT;*s!=0;s++);
  495. if ( *s-1!='\\' ){        //最後に\がついているか?
  496.     *s++='\\';
  497.     *s=0;
  498. }
  499. strcat(MAT,"MAT.$$$");    //MAT.$$$のフルパス、のはず
  500. if ( DrvAccess(0,MAT)!=0 ){
  501.     printf(    " 環境変数`MATIER'の内容のドライブは用意されていません。\n");
  502.     return(-1);
  503. }
  504. f=fopen(MAT,"rt");
  505. if ( f==NULL ){
  506.     printf(    " MAT.$$$が見つかりません。\n"
  507.         " 環境変数`MATIER'の内容に誤りがある可能性があります。\n"
  508.     );
  509.     return(-1);
  510. }
  511. while( fgets(buf,128,f)!=NULL ){
  512.     if ( buf[0]=='V' && buf[1]==' ' ){
  513.         sscanf(buf,"%s %p %d %d",dmi,&mat_vadds,&mat_xwidth,&mat_ywidth);
  514.         break;
  515.     }
  516. }
  517. fclose( f );
  518. if ( (int)mat_vadds==0 ){
  519.     printf(    " MATIER で仮想画面が設定されていないようです。\n");
  520.     return(-1);
  521. }
  522. //printf(    " adds=%X,x=%d,y=%d\n",mat_vadds,mat_xwidth,mat_ywidth);
  523. return(0);
  524. }
  525. /********************************************************
  526.         このドライブは xx できる?
  527. [in] md=0 ; アクセスできる?
  528.     1 ; 書き込みできる?
  529. [out] 0 ; 可能
  530.      -1 ; 出来ない
  531. ********************************************************/
  532. int    DrvAccess(md,st)
  533. int    md;
  534. UNchar    *st;
  535. {
  536. int    i,j,d;
  537. UNchar    buf[256];
  538. UNchar    dmy[256];
  539. strsfn(st,buf,dmy,dmy,dmy);
  540. d=((buf[0]|0x20)-'a');
  541. if ( d<0 || d>26 )
  542.     d=_dos_curdrv();
  543. j=_dos_drvctrl(0,d+1);
  544. //        printf("drive=%d  r=%02X\n",d,j);
  545. if ( md==0 ){
  546.     if ( (j&bit(1))!=0 && (j&bit(2))==0 )
  547.         return(0);
  548. } elif ( md==1 ){
  549.     if ( (j&bit(1))!=0 && (j&bit(3))==0 )
  550.         return(0);
  551. }
  552. return(-1);
  553. }
  554. /**************************************/
  555. static    char    Dsof=1;    //降順なら負の数に
  556. /*+++*/
  557. /*---------|name|-----------*/
  558. static    int    Dso_Name(D1,D2)
  559. struct  DDST *D1,*D2;
  560. {
  561. int    j;
  562. char    d1[21],d2[21];
  563. j=jstrcmpi(D1->fname,D2->fname);
  564. if ( j!=0 )
  565.     return( (Dsof==1)?j:-j );
  566. /*名前が同じなら拡張子を見る*/
  567. j=jstrcmpi(D1->fext,D2->fext);
  568. return( (Dsof==1)?j:-j );
  569. }
  570. /*---------|exp|-----------*/
  571. static    int    Dso_Ext(D1,D2)
  572. struct  DDST *D1,*D2;
  573. {
  574. int    j;
  575. char    d1[21],d2[21];
  576. j=jstrcmpi(D1->fext,D2->fext);
  577. if ( j!=0 )
  578.     return( (Dsof==1)?j:-j );
  579. /*拡張子が同じなら名前を見る*/
  580. j=jstrcmpi(D1->fname,D2->fname);
  581. return( (Dsof==1)?j:-j );
  582. }
  583. /*---------|size|-----------*/
  584. static    int    Dso_Size(D1,D2)
  585. struct  DDST *D1,*D2;
  586. {
  587. int i=D1->size;
  588. int j=D2->size;
  589. return( (i==j)?0:(i<j)?-Dsof:Dsof );
  590. }
  591. /*---------|date|-----------*/
  592. static    int    Dso_Date(D1,D2)
  593. struct  DDST *D1,*D2;
  594. {
  595. int i=D1->date;
  596. int j=D2->date;
  597. return( (i==j)?0:(i<j)? Dsof:-Dsof );
  598. }
  599. /*+++++++++++++++++++++++++++++*/
  600. static    void    DDS_sort(s1,s2,sm)
  601. int    s1,s2,sm;
  602. {
  603. static    (*foo[4])={Dso_Name,Dso_Date,Dso_Size,Dso_Ext};
  604. //sm  =  1:name順 2:date順 3:サイズ順 4:exp順 (負の数なら降順)
  605. int    i,j,m,n,z;
  606. int    b;
  607. if ( sm==0 ) return;
  608. if ( sm<0 ) {
  609.     sm=-sm;
  610.     Dsof=-1;    //降順なら負の数に
  611. } else    Dsof=1;
  612. sm--;
  613. qsort( &DDS[s1],s2-s1+1,sizeof(struct  DDST),foo[sm] );
  614. }
  615.